package com.ldc.common.utils;

import com.ldc.common.constants.ConstantsParams;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * @auther liudc
 * @since 2022/11/5
 */
@Component
public class JwtTokenUtils {
    private static final Logger logger = LoggerFactory.getLogger(JwtTokenUtils.class);
    // 过期时间 一个小时
    private static final long EXPIRATION_TIME = 50 * 60 * 1000;
    // Key
    private final static Key SIGN_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS512);

    /**
     * @param mapData 数据
     * @return Token
     */
    public static String createToken(Map<String, Object> mapData) {
        return Jwts.builder()
                .setId(UUID.randomUUID().toString())
                // 设置主体
                .setSubject(ConstantsParams.JWT_SUBJECT)
                // 设置超时时间
                .setExpiration(new Date(getExpirationTime()))
                // 设置JWT的头信息
                .signWith(SIGN_KEY, SignatureAlgorithm.HS512)
                // 压缩方式
                .compressWith(CompressionCodecs.GZIP)
                // 数据
                .addClaims(mapData)
                .compact();
    }

    /**
     * 获取过期时间
     *
     * @return 获取过期时间
     */
    public static long getExpirationTime() {
        return System.currentTimeMillis() + EXPIRATION_TIME;
    }

    /**
     * 解析数据Token
     *
     * @param token Token
     * @return 数据
     */
    public static Jws<Claims> parseToken(String token) {
        return Jwts.parserBuilder()
                .requireSubject(ConstantsParams.JWT_SUBJECT)
                .setSigningKey(SIGN_KEY)
                .build()
                .parseClaimsJws(token);
    }

    /**
     * @param token 令牌
     * @return 数据
     */
    public static Claims parseClaims(String token) {
        return parseToken(token).getBody();
    }

    /**
     * @param token 凭证
     * @param key   映射
     * @return 数据
     */
    public static Object getMapperValue(String token, String key) {
        return parseClaims(token).get(key);
    }

    /**
     * @param token 令牌
     * @return 数据
     */
    public static boolean checkToken(String token) {
        try {
            if (StringUtils.isEmpty(token)) {
                return false;
            }
            parseClaims(token);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
